home *** CD-ROM | disk | FTP | other *** search
/ MACD 5 / MACD 5.bin / www / ludzie / txf / progs / anystrtolong.lha / AnyStrToLong / AnyLongToStr.asm next >
Assembly Source File  |  1980-01-04  |  5KB  |  252 lines

  1.  
  2. **********************************************************************
  3. *
  4. *    AnyLongToStr - Convert 32-bit value to ASCII
  5. *
  6. * Input:  d0 - the value to convert
  7. *         d1 - flags
  8. *         a0 - pointer to a buffer 
  9. * Output: d0 - number of characters written (or null for error)
  10. *         a0 - address of the terminating null
  11. *
  12. *
  13. *    Flags are:
  14. *   LTS_DECIMAL   - normal decimal conversion
  15. *   LTS_SIGN_LONG - decimal signed mode (longword)
  16. *   LTS_SIGN_WORD - signed (word)
  17. *   LTS_SIGN_BYTE - signed (byte)
  18. *   LTS_BINARY    - convert to binary
  19. *   LTS_HEX_UPPER - convert to hex (A-F)
  20. *   LTS_HEX_LOWER - convert to hex (a-f)
  21. *
  22. *
  23. *    You should pass a buffer with at least 11/12 (decimal/negative
  24. * decimal), 9 (hex) or 33 (binary) bytes of space.
  25. *    If flags = #1, checks the 31 bit and if it is high, assumes
  26. * the  value is lower than 0.
  27. *    This string is null-terminated. Address of the terminating
  28. * null is returned in a0. The null is included in number of chars
  29. * written.
  30. *
  31. *    When you specify decimal non-signed mode, then even if
  32. * bit 31 is set you'll get value in range 0 to 4.294.967.295. In
  33. * signed mode you'll get values in range from -2.147.483.647 to
  34. * 2.147.483.648 (negative when bit 31/15/7 is set, depending on the
  35. * choosen mode). Minus sign is written, if needed (and added to chars
  36. * counter returned in d0).
  37. *
  38. *    No prefix is written in hex/bin mode!!! If you need it, write
  39. * it yourself. That's how you can choose between '$'/'0x' :-)
  40. *
  41. *    Alters only scratch registers (d0, d1, a0, a1). Uses 12 bytes
  42. * of stack.
  43. *
  44. *
  45. *    © 1996 by Tadek Knapik (tadek@student.uci.agh.edu.pl).
  46. *         Public Domain. E-mail appreciated :-)
  47. *
  48. **********************************************************************
  49.  
  50.  
  51. LTS_DECIMAL    equ    0
  52. LTS_BINARY    equ    2
  53. LTS_HEX_UPPER    equ    4
  54. LTS_HEX_LOWER    equ    8
  55. LTS_SIGN_LONG    equ    16
  56. LTS_SIGN_WORD    equ    32
  57. LTS_SIGN_BYTE    equ    64
  58. LTS_NEGATIVE    equ    LTS_SIGN_LONG
  59. LTS_HEX        equ    LTS_HEX_UPPER
  60.  
  61.  
  62. AnyLongToStr:
  63.     movem.l    d2-d4,-(sp)
  64.     moveq    #0,d2            ;the counter
  65.  
  66.     cmpi.l    #LTS_DECIMAL,d1
  67.     beq    LTSDecConvert
  68.  
  69.     cmpi.l    #LTS_SIGN_LONG,d1
  70.     beq    LTSMinDecConvert
  71.  
  72.     cmpi.l    #LTS_SIGN_WORD,d1
  73.     beq    LTSMinWDecConvert
  74.  
  75.     cmpi.l    #LTS_SIGN_BYTE,d1
  76.     beq    LTSMinBDecConvert
  77.  
  78.     cmpi.l    #LTS_BINARY,d1
  79.     beq    LTSBinConvert
  80.  
  81.     move.l    #'A',d2            ;ASCII base uppercased
  82.  
  83.     cmpi.l    #LTS_HEX_UPPER,d1
  84.     beq    LTSHexConvert
  85.  
  86.     move.l    #'a',d2            ;ASCII base lowercased
  87.  
  88.     cmpi.l    #LTS_HEX_LOWER,d1
  89.     beq    LTSHexConvert
  90.  
  91. LTSError:
  92.     movem.l    (sp)+,d2-d4
  93.     moveq    #0,d1
  94.     moveq    #0,d0
  95.     rts
  96.  
  97. ;--------------------
  98.  
  99. LTSMinBDecConvert:
  100.     ext.w    d0            ;extend to word
  101. LTSMinWDecConvert
  102.     ext.l    d0            ;extend to longword
  103.  
  104. LTSMinDecConvert:
  105.     btst    #31,d0
  106.     beq    LTSDecConvert
  107.     move.b    #'-',(a0)+        ;the minus sign
  108.     addq.l    #1,d2
  109.     neg.l    d0            ;so I need plus now
  110.  
  111. LTSDecConvert:
  112.     moveq    #0,d1            ;zeroes flag
  113.     move.l    #1000000000,d4        ;32-bit max power of 10
  114.  
  115. LTSDecAgain:
  116.     cmp.l    d4,d0
  117.     bcc    LTSDecMatch
  118.  
  119.     tst.l    d1            ;write zeroes?
  120.     beq    LTSDecNextPass        ;not yet
  121.  
  122.     move.b    #'0',(a0)+        ;write it
  123.     addq.l    #1,d2            ;one character more
  124.     bra    LTSDecNextPass
  125.  
  126. LTSDecMatch:
  127.     moveq    #1,d1            ;means write zeros from now
  128.     moveq    #0,d3            ;clear temporary
  129.  
  130. LTSDecLoop:
  131.     addq.l    #1,d3            ;
  132.  
  133.     sub.l    d4,d0
  134.     bpl    LTSDecLoop        ;branch if not less than 0
  135.  
  136.     add.l    d4,d0            ;did it too many times
  137.     subq.l    #1,d3            ;as well
  138.  
  139.     addi.l    #'0',d3            ;ASCII 0
  140.     move.b    d3,(a0)+
  141.     addq.l    #1,d2            ;the counter
  142.  
  143. LTSDecNextPass:
  144.     bsr    LTSDecDivideByTen
  145.     tst.l    d4
  146.     beq    LTSError
  147.  
  148.     cmpi.l    #1,d4
  149.     bne    LTSDecAgain
  150.  
  151. ;less than 10 in d0..
  152.  
  153.     addi.l    #'0',d0
  154.     move.b    d0,(a0)+
  155.     addq.l    #1,d2
  156.  
  157. LTSDecOver:
  158.     move.b    #0,(a0)
  159.     suba.l    #1,a0
  160.     addq.l    #1,d2            ;null is a character, too
  161.     move.l    d2,d0
  162.     movem.l    (sp)+,d2-d4
  163.     rts
  164.  
  165.  
  166. LTSDecDivideByTen:
  167.  
  168. ;
  169. ;if your proggy is to be run on 020+ only!
  170. ; But beware! It is one of instructions not present on 68060! And it
  171. ;will be significantly slower, because it is emulated in software then.
  172. ;
  173. ;    divu.l    #10,d4
  174. ;    rts
  175.  
  176. ;now 68000 part. Thanks for Simon N Goodwin for this routine!
  177.  
  178.     moveq   #0,d3            ;temporary register
  179.     swap    d4            ;higher 16 bits
  180.     move.w  d4,d3            ;
  181.     divu    #10,d3                  ;divide higher 16 bits
  182.     swap    d3            ;store in high word of d3
  183.     move.w  d3,d4            ;safe?
  184.     swap    d4            ;
  185.     divu    #10,d4                  ;divide lower 16 bits
  186.     move.w  d4,d3            ;
  187.     exg    d3,d4            ;
  188.     rts
  189.  
  190.  
  191. ;--------------------
  192.  
  193. LTSHexConvert:
  194.     move.l    #8,d4            ;8 characters
  195.  
  196. LTSHexLoop:
  197.     rol.l    #4,d0            ;prepare next nybble
  198.  
  199.     move.l    d0,d1            ;spare
  200.     andi.l    #$0000000F,d1        ;the nybble
  201.  
  202.     move.l    #'0',d3            ;ASCII base (for 0-9)
  203.  
  204.     cmpi.l    #9,d1            ;normal or a-f
  205.     ble    LTSHexDec
  206.  
  207.     move.l    d2,d3            ;new base (A-F or a-f)
  208.     subi.l    #$A,d1            ;new value :-)
  209.  
  210. LTSHexDec:
  211.     add.l    d1,d3            ;add soup base, cover it and
  212.     move.b    d3,(a0)+        ;wait for 3 minutes :-)
  213.  
  214.     subq.l    #1,d4            ;
  215.     bne    LTSHexLoop
  216.  
  217.     move.b    #0,(a0)            ;terminate
  218.     suba.l    #1,a0            ;
  219.     movem.l    (sp)+,d2-d4        ;give it back..
  220.     move.l    #9,d0            ;no way for 8 :-)
  221.     rts
  222.  
  223. ;--------------------
  224.  
  225.  
  226. LTSBinConvert:
  227.     move.l    #32,d4            ;8 characters
  228.  
  229. LTSBinLoop:
  230.     rol.l    #1,d0            ;one bit
  231.  
  232.     move.l    d0,d1            ;spare
  233.     andi.l    #$00000001,d1        ;the bit
  234.  
  235.     move.l    #'0',d3            ;ASCII base
  236.  
  237.     add.l    d1,d3            ;do it again
  238.     move.b    d3,(a0)+        ;
  239.  
  240.     subq.l    #1,d4            ;
  241.     bne    LTSBinLoop
  242.  
  243.     move.b    #0,(a0)            ;terminate
  244.     suba.l    #1,a0            ;
  245.     movem.l    (sp)+,d2-d4        ;give it back..
  246.     move.l    #33,d0            ;am I sure of that?
  247.     rts
  248.  
  249.  
  250. **********************************************************************
  251.  
  252.